<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>apply方法,改变this指向</title>
</head>
<body>
<p>
    JavaScript 中还允许指定函数中 this 的指向，有 3 个方法可以动态指定普通函数中 this 的指向 <br>
     call() <br>
     apply() <br>
     bind()
</p>
<hr>

<h3> apply()-理解</h3>
<p>
    使用 apply 方法调用函数，同时指定被调用函数中 this 的值 <br>
     语法： <br>
    函数.apply(thisArg, [argsArray]) <br>
     thisArg：在函数运行时指定的 this 值 <br>
     argsArray：传递的值，必须包含在数组里面 <br>
     返回值就是函数的返回值，因为它就是调用函数 <br>
     因此 apply 主要跟数组有关系，比如使用 Math.max() 求数组的最大值
</p>
<p>
    1. call和apply的区别是？ <br>
     都是调用函数，都能改变this指向 <br>
     参数不一样，apply传递的必须是数组
</p>


<script>
    const 对象 = {
        年龄: 18
    }

    function 函数(x, y) {
        console.log(this) // {年龄: 18}, apply规定了指向 '对象'
        console.log(x + y)
    }

    // 1. 调用函数
    // 2. 改变this指向
    //  函数.apply(this指向谁, 数组参数)
    函数.apply(对象, [7, 2]) // 第一个参数 this指向谁,  其他参数是 函数的正常传参(这里必须是数组)
    // 3. 返回值   本身就是在调用函数，所以返回值就是函数的返回值

    // 案例: 使用场景： 求数组最大值
    // const max = Math.max(1, 2, 3)
    // console.log(max)

    const 数字数组 = [100, 44, 77]
    // apply规定,this指向
    const 最大值 = Math.max.apply(Math, 数字数组) // this指向Math, 返回值就是函数的返回值
    const 最小值 = Math.min.apply(null, 数字数组) // 不规定指向设置 null
    console.log(最大值, 最小值)


    // 使用场景： 求数组最大值.  以前是讲过 展开运算符 方法
    console.log(Math.max(...数字数组))
</script>
</body>
</html>